home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xearth-0.92 / resources.c < prev    next >
C/C++ Source or Header  |  1995-06-25  |  6KB  |  223 lines

  1. /*
  2.  * resources.c
  3.  * march 1994
  4.  *
  5.  * RCS $Id: resources.c,v 1.6 1994/05/20 01:37:40 tuna Exp $
  6.  *
  7.  * this file is copied essentially verbatim from the sources for Jamie
  8.  * Zawinski's xscreensaver package; his original copyright notice
  9.  * follows this comment.
  10.  */
  11.  
  12. /* xscreensaver, Copyright (c) 1992 Jamie Zawinski <jwz@lucid.com>
  13.  *
  14.  * Permission to use, copy, modify, distribute, and sell this software
  15.  * and its documentation for any purpose is hereby granted without
  16.  * fee, provided that the above copyright notice appear in all copies
  17.  * and that both that copyright notice and this permission notice
  18.  * appear in supporting documentation. No representations are made
  19.  * about the suitability of this software for any purpose. It is
  20.  * provided "as is" without express or implied warranty.
  21.  */
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <X11/Xos.h>
  26. #include <X11/Xlib.h>
  27. #include <X11/Xresource.h>
  28.  
  29. /* Resource functions.  Assumes: */
  30.  
  31. extern char *progname;
  32. extern char *progclass;
  33. extern XrmDatabase db;
  34.  
  35. #ifndef isupper
  36. # define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
  37. #endif
  38. #ifndef _tolower
  39. # define _tolower(c)  ((c) - 'A' + 'a')
  40. #endif
  41.  
  42. char *
  43. get_string_resource (res_name, res_class)
  44.      char *res_name, *res_class;
  45. {
  46.   XrmValue value;
  47.   char    *type;
  48.   char full_name [1024], full_class [1024];
  49.   strcpy (full_name, progname);
  50.   strcat (full_name, ".");
  51.   strcat (full_name, res_name);
  52.   strcpy (full_class, progclass);
  53.   strcat (full_class, ".");
  54.   strcat (full_class, res_class);
  55.   if (XrmGetResource (db, full_name, full_class, &type, &value))
  56.     {
  57.       char *str = (char *) malloc ((unsigned) value.size + 1);
  58.       strncpy (str, (char *) value.addr, value.size);
  59.       str [value.size] = 0;
  60.       return str;
  61.     }
  62.   return 0;
  63. }
  64.  
  65. int 
  66. get_boolean_resource (res_name, res_class)
  67.      char *res_name, *res_class;
  68. {
  69.   char *tmp, buf [100];
  70.   char *s = get_string_resource (res_name, res_class);
  71.   char *os = s;
  72.   if (! s) return 0;
  73.   for (tmp = buf; *s; s++)
  74.     *tmp++ = isupper (*s) ? _tolower (*s) : *s;
  75.   *tmp = 0;
  76.   free (os);
  77.  
  78.   if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
  79.     return 1;
  80.   if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
  81.     return 0;
  82.   fprintf (stderr, "%s: %s must be boolean, not %s.\n",
  83.        progname, res_class, buf);
  84.   return 0;
  85. }
  86.  
  87. int 
  88. get_integer_resource (res_name, res_class)
  89.      char *res_name, *res_class;
  90. {
  91.   int val;
  92.   char c, *s = get_string_resource (res_name, res_class);
  93.   if (!s) return 0;
  94.   if (1 == sscanf (s, " %d %c", &val, &c))
  95.     {
  96.       free (s);
  97.       return val;
  98.     }
  99.   fprintf (stderr, "%s: %s must be an integer, not %s.\n",
  100.        progname, res_name, s);
  101.   free (s);
  102.   return 0;
  103. }
  104.  
  105. double
  106. get_float_resource (res_name, res_class)
  107.      char *res_name, *res_class;
  108. {
  109.   double val;
  110.   char c, *s = get_string_resource (res_name, res_class);
  111.   if (! s) return 0.0;
  112.   if (1 == sscanf (s, " %lf %c", &val, &c))
  113.     {
  114.       free (s);
  115.       return val;
  116.     }
  117.   fprintf (stderr, "%s: %s must be a float, not %s.\n",
  118.        progname, res_name, s);
  119.   free (s);
  120.   return 0.0;
  121. }
  122.  
  123.  
  124. unsigned int
  125. get_pixel_resource (res_name, res_class, dpy, cmap)
  126.      char *res_name, *res_class;
  127.      Display *dpy;
  128.      Colormap cmap;
  129. {
  130.   XColor color;
  131.   char *s = get_string_resource (res_name, res_class);
  132.   if (!s) goto DEFAULT;
  133.  
  134.   if (! XParseColor (dpy, cmap, s, &color))
  135.     {
  136.       fprintf (stderr, "%s: can't parse color %s\n", progname, s);
  137.       goto DEFAULT;
  138.     }
  139.   if (! XAllocColor (dpy, cmap, &color))
  140.     {
  141.       fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
  142.       goto DEFAULT;
  143.     }
  144.   free (s);
  145.   return color.pixel;
  146.  DEFAULT:
  147.   if (s) free (s);
  148.   return (strcmp (res_class, "Background")
  149.       ? WhitePixel (dpy, DefaultScreen (dpy))
  150.       : BlackPixel (dpy, DefaultScreen (dpy)));
  151. }
  152.  
  153.  
  154. int
  155. parse_time (string, seconds_default_p, silent_p)
  156.      char *string;
  157.      Bool seconds_default_p, silent_p;
  158. {
  159.   unsigned int h, m, s;
  160.   char c;
  161.   if (3 == sscanf (string,   " %u : %2u : %2u %c", &h, &m, &s, &c))
  162.     ;
  163.   else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) ||
  164.        2 == sscanf (string,    " %u : %2u %c", &m, &s, &c))
  165.     h = 0;
  166.   else if (1 == sscanf (string,       " : %2u %c", &s, &c))
  167.     h = m = 0;
  168.   else if (1 == sscanf (string,          " %u %c",
  169.             (seconds_default_p ? &s : &m), &c))
  170.     {
  171.       h = 0;
  172.       if (seconds_default_p) m = 0;
  173.       else s = 0;
  174.     }
  175.   else
  176.     {
  177.       if (! silent_p)
  178.     fprintf (stderr, "%s: invalid time interval specification \"%s\".\n",
  179.          progname, string);
  180.       return -1;
  181.     }
  182.   if (s >= 60 && (h != 0 || m != 0))
  183.     {
  184.       if (! silent_p)
  185.     fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string);
  186.       return -1;
  187.     }
  188.   if (m >= 60 && h > 0)
  189.     {
  190.       if (! silent_p)
  191.     fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string);
  192.       return -1;
  193.     }
  194.   return ((h * 60 * 60) + (m * 60) + s);
  195. }
  196.  
  197. static unsigned int 
  198. get_time_resource (res_name, res_class, sec_p)
  199.      char *res_name, *res_class;
  200.      Bool sec_p;
  201. {
  202.   int val;
  203.   char *s = get_string_resource (res_name, res_class);
  204.   if (!s) return 0;
  205.   val = parse_time (s, sec_p, False);
  206.   free (s);
  207.   return (val < 0 ? 0 : val);
  208. }
  209.  
  210. unsigned int 
  211. get_seconds_resource (res_name, res_class)
  212.      char *res_name, *res_class;
  213. {
  214.   return get_time_resource (res_name, res_class, True);
  215. }
  216.  
  217. unsigned int 
  218. get_minutes_resource (res_name, res_class)
  219.      char *res_name, *res_class;
  220. {
  221.   return get_time_resource (res_name, res_class, False);
  222. }
  223.